# https://www.cnblogs.com/Deaseyy/p/11921631.html
import pandas as pd
import numpy as np


# 1.创建多层行索引
def func1():
    # 隐式构造
    index = [['一班', '一班', '一班', '二班', '二班', '二班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']]
    columns = [['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']]

    data = np.random.randint(0, 150, size=(6, 6))
    df = pd.DataFrame(data=data, index=index, columns=columns)
    # print(df)

    # Series也可以创建多层索引
    data = np.random.randint(0, 150, size=6)
    s = pd.Series(data=data, index=index)
    # print(s)

    # 两个多层级df拼接
    index = [['三班', '三班', '三班', '四班', '四班', '四班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']]
    columns = [['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '物理', '语文', '数学', '物理']]
    data = np.random.randint(0, 150, size=(6, 6))
    df2 = pd.DataFrame(data, index, columns)
    # print(df2)

    # print(pd.concat([df, df2]))

    # 显示构造 pd.MultiIndex
    # 使用数组
    index = pd.MultiIndex.from_arrays([['一班', '一班', '一班', '二班', '二班', '二班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']])
    columns = [['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']]
    data = np.random.randint(0, 150, size=(6, 6))
    df = pd.DataFrame(data=data, index=index, columns=columns)
    # print(df)

    # 使用元组
    index = pd.MultiIndex.from_tuples(
        [('一班', '张三'), ('一班', '李四'), ('一班', '王五'), ('二班', '赵六'), ('二班', '田七'), ('二班', '孙八')])
    columns = [['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']]
    data = np.random.randint(0, 150, size=(6, 6))
    df = pd.DataFrame(data=data, index=index, columns=columns)
    # print(df)

    # 使用 product -- 最简单，推荐使用 ,有条件限制
    index = pd.MultiIndex.from_arrays([['一班', '一班', '一班', '二班', '二班', '二班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']])
    columns = pd.MultiIndex.from_product([['期中', '期末'], ['语文', '数学', '英语']])
    data = np.random.randint(0, 150, size=(6, 6))
    df = pd.DataFrame(data=data, index=index, columns=columns)
    # print(df)


# 2.多层索引对象的索引与切片操作
def func2():
    # Series 操作
    index = [['一班', '一班', '一班', '二班', '二班', '二班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']]
    data = np.random.randint(0, 150, size=6)
    s = pd.Series(data=data, index=index)
    print(s)

    # 索引=========================
    print(s["一班", "张三"])
    print(s.loc["一班"].loc["张三"])
    print(s.loc["一班", "张三"], "推荐写法")
    print(s.iloc[0], "隐式索引，直接从最内层开始索引，起始下标为 0")
    print(s.iloc[[0]])

    # 切片=========================
    print(s.loc["一班":])
    print(s.iloc[:4])


def func3():
    """
    索引:
        重要: 列索引使用 [], 行索引需使用 loc[]
    注意在对行索引的时候，若一级行索引还有多个，对二级行索引会遇到问题！
    也就是说，无法直接对二级索引进行索引，必须让二级索引变成一级索引后才能对其进行索引！
    """
    # Dataframe 操作
    index = [['一班', '一班', '一班', '二班', '二班', '二班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']]
    columns = [['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']]

    data = np.random.randint(0, 150, size=(6, 6))
    df = pd.DataFrame(data=data, index=index, columns=columns)
    print(df)

    # 索引=========================
    # print(df["期中", "语文"], "列索引")
    # print(df.loc['一班', '张三'], "行多级索引的索引和切片操作")
    # print(df.loc["二班", ("期末", "英语")])
    # print(df.loc[("二班", "田七"), ("期末", "英语")])

    # 切片=========================
    # print(df['一班': '二班'])
    # print(df.loc['一班':])
    # print(df.iloc[0:4], "隐式行切片")


if __name__ == '__main__':
    # func1()
    # func2()
    func3()
